#include<stdio.h>
#include<signal.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>

/*---------------阻塞信号------------------*/
/*--4.用软件条件产生信号--*/
//int main()
//{
//  int res = alarm(30);
//  printf("res = %d\n", res);
//  sleep(5);
//  int ret = alarm(0);
//  printf("ret = %d\n", ret);
//  return 0;
//}

/*--系统1s内可以增加多少次 --*/
//int count = 0;
//int main()
//{
//  alarm(1);
//  while(1)
//  {
//    count++;
//    printf("count=%d\n",count);
//  }
//  return 0;
//}
/*--上面在while循环中进行打印次数，但是IO输出效率低--*/
/*--下面在handler函数中打印一次，在while循环中记录，效率高--*/
//int count = 0;
//void handler(int signo)
//{
//  printf("count=%d\n",count);
//  exit(1);
//}
//int main()
//{
//  signal(SIGALRM, handler);
//  alarm(1);
//  while(1)
//  {
//    count++;
//  }
//  return 0;
//}

/*--3.调用系统函数产生信号--*/
//int main(int argc, char* argv[])
//{
//  if(argc != 3)
//  {
//    printf("./mytest pid signo\n");
//    exit(1);
//  }
//  int pid = atoi(argv[1]);
//  int signo = atoi(argv[2]);
//  
//  /*--系统的信号函数--*/
//  // kill(pid, signo);
//  // raise(signo);
//
//  return 0;
//}


//void hander(int signo)
//{
//  switch(signo)
//  {
//    case 2:
//      printf("SIGINT signo : %d\n", signo);
//      break;
//    case 3:
//      printf("SIGQUIT signo : %d\n", signo);
//      break;
//    case 9:
//      printf("SIGKILL signo : %d\n", signo);
//      break;
//    default:
//      printf("other signo: %d\n", signo);
//      break;
//  }
//  // exit(1);
//}
//int main()
//{
//  for(int sig = 0; sig<=31; sig++)
//  {
//    signal(sig, hander);
//  }
//  sleep(3);
//  /*--产生SIGABRT(6)信号--*/
//  abort();
//  return 0;
//}

/*--2.硬件异常产生信号--*/
//int main()
//{
//  if(fork() == 0)
//  {
//    printf("I am child\n");
//    /*--指针段错误，对空指针解引用赋值--*/
//    //int* p = NULL;
//    //*p = 100;
//    
//    /*--除数为0--*/
//    int a = 10;
//    a /= 0;
//    sleep(1);
//  }
//
//  int status = 0;
//  waitpid(-1, &status, 0);
//  printf("wait code: %d, wait signal: %d, wait core dump:%d\n", (status>>8)&0xFF, status&0x7F, (status>>7)& 1);
//  return 0;
//}

/*--1.用键盘产生信号--*/
void hander(int signo)
{
  switch(signo)
  {
    case 2:
      printf("SIGINT signo : %d\n", signo);
      break;
    case 3:
      printf("SIGQUIT signo : %d\n", signo);
      break;
    case 9:
      printf("SIGKILL signo : %d\n", signo);
      break;
    default:
      printf("other signo: %d\n", signo);
      break;
  }
  // exit(1);
}

int main()
{
  // 对前32个信号进行捕获，自定义其触发后的操作
  for(int sig = 0; sig <= 31; ++sig)
  {
    signal(sig, hander);
  }

  while(1)
  {
    printf("I am a process\n");
    sleep(1);
  }
  return 0;
}

